package com.cskaoyan.javase.oop2.encapsulate._1extends._10final._3variable._3static;
/**
 * final修饰静态成员变量表示一个静态的"常量"
 * 在类的全局仅有一份，所以final修饰静态成员变量，也称之为"全局常量"。
 * 它是一个真正意义上的常量，不会因为创建对象而更改，实际开发中的常量多使用它。
 *
 * 语法：
 * [访问权限修饰符] static final 数据类型 变量名;
 * 全局常量不能依赖于默认初始化赋值,必须进行手动赋值,而且是在类加载过程中进行手动赋值
 * 其方式有:
 *      1.显式赋值
 *      2.静态代码块赋值
 * 以上两种方式,必须选择其一,也只能选择其一.
 *
 * 注意事项:
 *
 *    1.final static 还是 static final 实测下来，都是可以的，根据个人习惯使用即可。
 *      对于修饰符的使用,实际上没有语法上的强制要求,修饰符是可以随便写位置的
 *      但实际上,程序员习惯总是将"访问权限修饰符"放在修饰符的最前面
 *      然后其他的可以自由一点
 *
 *
 *      2.final修饰静态成员变量是一个全局常量，不会害怕外界访问和修改。所以在很多时候，它的访问权限修饰符都是public的。(但是具体情况具体分析,也有一些全局常量不希望给外界使用,那么照样用private修饰它)
 *
 *      3.如果使用静态代码测试类加载
 *      那么访问类的全局常量，有些场景是不会触发类加载的。（感兴趣自己测试一下，作为锻炼动手能力的小demo）
 *
 * @since 10:11
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(A.num);
        System.out.println(A.var);
        // A.var = "111";
    }
}

class A{
    // Variable 'num' might not have been initialized
    // static final int num;
    public static final int num = 100;
    static final String var;
    static {
        var = "hello world!";
    }
}
